package com.guess.study.designpattern.templatemethod;

/**
 * Created by tianran on 2019-06-14.
 */
public abstract class AbstractClass {

    /**
     * 基本方法
     */
    protected abstract void doSomething();

    /**
     * 基本方法
     */
    protected void doAnything() {
        System.out.println("AbstractClass doAnything()");
    }

    /**
     * 依赖于钩子方法的基本方法
     */
    protected abstract void dependOnHook();

    /**
     * 模板方法，为了防止恶意的操作，一般模板方法都加上final关键字，不允许被覆写
     */
    public final void templateMethod() {
        doSomething();
        doAnything();

        if (hook()) {
            dependOnHook();
        }

    }

    /**
     * 钩子方法：空实现或默认实现，子类可以覆写；由子类的一个方法返回值决定公共部分的执行结果
     *
     * @return
     */
    protected boolean hook() {
        System.out.println("AbstractClass hook()");
        return true;
    }
}
